package br.org.acessobrasil.portal.util;

import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.log4j.Logger;

/**
 * Envia o email, antigo G_Email.<br>
 * Nao funciona na locaweb, na locaweb use o SendMailUsingAuthentication
 */
public class SendEmail implements SendMailProvider {
	private static Logger logger = Logger.getLogger(SendEmail.class);
	private String hostName;
	private String user;
	private String pass;
	private String paraDefault;
	private String paraDefaultNome;
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.util.SendMailProvider#enviarHtmlEmail(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.io.File[])
	 */
	public void enviarHtmlEmail(String assunto, String mensagem, String para,String paraNome, String de,String deNome,File[] anexo) throws Exception{
		try {
			logger.debug("Enviar e-mail em HTML para " + para + " de " + de);
			HtmlEmail email = new HtmlEmail();
			email.setHostName(hostName);
			//email.setHostName("smtp.acessobrasil.org.br");
			if(user!=null && !user.equals("")){
				email.setAuthentication(user, pass);
			}
			email.addTo(para, paraNome);
			email.setFrom(de, deNome);
			email.setSubject(assunto);
			email.setHtmlMsg(mensagem.replace("\n","<br />"));
			email.setTextMsg(mensagem);
			for(int i=0;i<anexo.length;i++){
				email.embed(anexo[i],anexo[i].getName());
			}
			email.send();
		} catch (Exception e) {
			logger.error("Erro ao enviar e-mail em HTML para " + para + " de " + de,e);
			throw new Exception("Falha ao enviar o e-mail. ");
		}
	}
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.util.SendMailProvider#enviarHtmlEmail(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
	 */
	public void enviarHtmlEmail(String assunto, String mensagem, String para,String paraNome, String de,String deNome) throws Exception{
		try {
			logger.debug("Enviar e-mail em HTML para " + para + " de " + de + " hostName="+hostName);
			HtmlEmail email = new HtmlEmail();
			email.setHostName(hostName);
			//email.setSmtpPort(587);
			//email.setHostName("smtp.acessobrasil.org.br");
			if(user!=null && !user.equals("")){
				logger.debug("user="+user + " pass = ******");
				email.setAuthentication(user, pass);
			}
			email.addTo(para, paraNome);
			email.setFrom(de, deNome);
			//email.setFrom("fabio@acessobrasil.org.br", deNome);
			email.setSubject(assunto);
			email.setHtmlMsg(mensagem.replace("\n","<br />"));
			email.setTextMsg(mensagem);
			email.send();
		} catch (Exception e) {
			logger.error("Erro ao enviar e-mail em HTML para " + para + " de " + de,e);
			throw new Exception("Falha ao enviar o e-mail. ");
		}
	}
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.util.SendMailProvider#enviarEmail(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)
	 */
	public void enviarEmail(String assunto, String mensagem, String para,String paraNome, String de,String deNome) throws Exception{
		try {
			logger.info("Enviar e-mail em TXT para " + para + " de " + de);
			HtmlEmail email = new HtmlEmail();
			email.setHostName(hostName);
			//email.setHostName("smtp.acessobrasil.org.br");
			if(user!=null && !user.equals("")){
				email.setAuthentication(user, pass);
			}
			
			//TODO tratar mais de um destinatario separado por virgulas
			if(para.equals("default")){
				para = paraDefault;
				paraNome = paraDefaultNome;
			}
			email.addTo(para, paraNome);
			email.setFrom(de, deNome);
			email.setSubject(assunto);
			email.setHtmlMsg(mensagem.replace("\n","<br />"));
			Pattern pat = Pattern.compile("<.*?>",Pattern.DOTALL);
			Matcher mat = pat.matcher(mensagem);
			if(mat.find()){
				mensagem = mat.replaceAll("");
			}
			email.setTextMsg(mensagem);
			email.send();
			logger.info("E-mail enviado de ["+de+"] para ["+para+"]");
		} catch (EmailException e){
			if(e.getMessage().contains("Illegal whitespace in address")){
				e.printStackTrace();
				throw new Exception("Digite corretamente o e-mail.");
			}else{
				e.printStackTrace();
				throw new Exception("Falha ao enviar o e-mail. ");
			}
		} catch (Exception e) {
			logger.error("Erro ao enviar e-mail TXT para " + para + " de " + de,e);
			throw new Exception("Falha ao enviar o e-mail. ");
		}
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.util.SendMailProvider#setHostName(java.lang.String)
	 */
	public void setHostName(String hostName) {
		this.hostName = hostName;
	}
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.util.SendMailProvider#setUser(java.lang.String)
	 */
	public void setUser(String user) {
		this.user = user;
	}
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.util.SendMailProvider#setParaDefault(java.lang.String)
	 */
	public void setParaDefault(String paraDefault){
		this.paraDefault = paraDefault;
		
	}
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.util.SendMailProvider#setParaDefaultNome(java.lang.String)
	 */
	public void setParaDefaultNome(String nome){
		this.paraDefaultNome = nome;
	}
	
	/* (non-Javadoc)
	 * @see br.org.acessobrasil.portal.util.SendMailProvider#setPass(java.lang.String)
	 */
	public void setPass(String pass) {
		this.pass = pass;
	}
	
}
